﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using GigaSite.Domain.Entities;
using GigaSite.Domain.Enums;
using GigaSite.Domain.Interfaces.Repositories;
using GigaSite.Domain.IoC;
using GigaSite.Web.Models;
using GigaSite.Web.Models.Validators;

namespace GigaSite.Web.Controllers
{
    /// <summary>
    /// Контроллер обрабатывающий все взаимодействия связанные с компаниями
    /// </summary>
    public class CompanyController : BaseController
    {
        /// <summary>
        /// Проверяет свободность или занятость системного имени компании
        /// </summary>
        /// <returns></returns>
        public ActionResult CheckCompanyName()
        {
            var repository = Locator.GetService<ICompaniesRepository>();
            var systemName = Request["SystemName"];

            return Content((repository.GetCompanyBySystemName(systemName) != null).ToString());
        }
        
        /// <summary>
        /// Отображает форму регистрации компании
        /// </summary>
        /// <returns>Форма регистрации новой компании в системе</returns>
        public ActionResult Register()
        {
            // Получаем репозиторий и находим все категории магазинов
            var repository = Locator.GetService<ICategoriesRepository>();
            var companyCategory = repository.GetCategoryBySystemName("Companies");
            if (companyCategory == null)
            {
                throw new ObjectNotFoundException("Супер-категория для организаций не найдена в базе данных");
            }
            ViewBag.categories = companyCategory.ChildCategories.ToList();

            return View(new RegisterCompanyModel());
        }

        /// <summary>
        /// Обрабатывает запрос на регистрацию своего магазина в базе
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        [HttpPost]
        public ActionResult Register(RegisterCompanyModel model)
        {
            // Получаем репозиторий и находим все категории магазинов
            var catRepository = Locator.GetService<ICategoriesRepository>();
            var companyCategory = catRepository.GetCategoryBySystemName("Companies");
            if (companyCategory == null)
            {
                throw new ObjectNotFoundException("Супер-категория для организаций не найдена в базе данных");
            }
            ViewBag.categories = companyCategory.ChildCategories.ToList();
            
            if (ModelState.IsValid)
            {
                // Валидируем модель
                var validator = ModelValidatorsFactory.GetValidator<RegisterCompanyModel>();
                var errors = validator.Validate(model);
                if (errors.Count > 0)
                {
                    return ViewWithModelErrors("Register", errors, model);
                }

                // сохраняем изображение логотипа компании в системе хранения изображений
                HttpPostedFileBase logoImageFile = Request.Files["LogoImageFile"];
                Image logoImage = null;
                if (logoImageFile != null)
                {
                    logoImage = Locator.GetService<IImagesRepository>().SavePostedFile(logoImageFile);
                }

                // Загружаем категории которые выбрал пользователь для своего магазина
                var categories =
                    model.CategoriesIds.Split(new[] {","}, StringSplitOptions.RemoveEmptyEntries).Select(
                        c => Convert.ToInt64(c)).Select(catRepository.Load).
                        Where(c => c != null).AsEnumerable();

                // Создаем магазин 
                var repository = Locator.GetService<ICompaniesRepository>();
                var newCompany = new Company()
                                     {
                                         DateCreated = DateTime.Now,
                                         CompanyType = CompanyTypes.InternetShop,
                                         CityId = 1,
                                         //TODO: потом разрешить выбор города, по умолчанию - Хабаровск
                                         Email = model.Email,
                                         Description = model.Description,
                                         SystemName = model.SystemName,
                                         DisplayName = model.Title,
                                         WebSite = model.Website,
                                         LogoImage = logoImage != null ? logoImage.URI : null
                                     };
                repository.CreateCompany(newCompany, CurrentUser, categories);
                repository.SubmitChanges();

                // Переходим на страницу созданного магазина
                return RedirectToAction("ViewCompany", new {id = model.SystemName});
            }
            else
            {
                return View(model);
            }
        }
    }
}
